#ifndef IDT_H
#define IDT_H

#include "memory.h"
#include "print.h"
#include "io.h"
#include "structs.h"
#include "panic.h"
#include "keyboard.h"
#include "syscall.h"
#include "fdc.h"
#include "scheduler.h"
#include "paging.h"

// IRQ0 Aufrufe pro Sekunde. Alle 5 MS
#define TICKS_PER_SECOND 200

/* Initialisiert die beiden PICs, mappt die IRQS von 0x20 an und aktiviert
 * anschliessend alle IRQS
 */
void irq_map ();

/* Setzt die Tick Geschwindigkeit
 * Parameter: Aufrufe pro Sekunde (Hertz)
 * Rückgaben: Keine
 */
void irq_settick (int);

/* Lädt die IDT
 */
void idt_load ();

/* Aktiviert einen IRQ/INT
 * Parameter: Nummer, Handler Funktion, Segment, Flags
 * Rückgaben: Keine
 */
void idt_set_gate (unsigned char, unsigned long, unsigned short, unsigned char);

/* Initialisiert alle IRQs und INTs und lädt anschliessend doe IDT neu
 */
void idt_init ();

/* Wird von den IRQ und INT Stub Funktionen aufgerufen. Zuvor wurde das Kernel Segment geladen
 * Parameter: Ein Pointer auf eine stack_frame Struktur (aka cpu_state)
 * Rückgaben: Ein Pointer auf eine (neue) stack_frame Struktur, die anschliessend geladen wird
 */
struct stack_frame  * idt_behandlung (struct stack_frame  *);

#endif
